package pe.gob.foncodes.ssa.web.controller;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;

import pe.gob.foncodes.ssa.bs.common.controller.GenericController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Modulo;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Perfil;
import pe.gob.foncodes.ssa.web.beans.UsuarioSinAccesoBean;
import pe.gob.foncodes.ssa.web.util.Impresion;

public class ReporteUsuarioSinAccesoController extends GenericController {

    protected static Logger log = Logger.getLogger(ReporteUsuarioSinAccesoController.class);
    private List<UsuarioSinAccesoBean> lstUsuarioSinAcceso = new ArrayList<UsuarioSinAccesoBean>();
    private List<Perfil> lstPerfiles;
    private List<Modulo> lstModulos;
    private String txtBusCodUsuario;
    private String txtBusNomUsuario;
    private java.util.Date txtBusFecInicio;
    private java.util.Date txtBusFecFin;
    private java.util.Date txtToday;
    private Long txtBusIdModulo;

    @Override
    public void init() {
        lstUsuarioSinAcceso = new ArrayList<UsuarioSinAccesoBean>();
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 0); //anything 0 - 23
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        this.txtToday = c.getTime();
        this.txtBusFecInicio = c.getTime();
        this.txtBusFecFin = c.getTime();
    }

    @Override
    public void search(ActionEvent event) throws Exception {
        log.info("Ejecutando filtro reporte");
        log.info(String.format("%s%s", "txtBusCodUsuario:", txtBusCodUsuario));
        log.info(String.format("%s%s", "txtBusNomUsuario:", txtBusNomUsuario));
        log.info(String.format("%s%s", "txtBusFecInicio:", txtBusFecInicio));
        log.info(String.format("%s%s", "txtBusFecFin:", txtBusFecFin));
        log.info(String.format("%s%s", "txtBusIdModulo:", txtBusIdModulo));

        this.txtBusCodUsuario = (this.txtBusCodUsuario == null) ? null : this.txtBusCodUsuario.trim().toUpperCase();
        this.txtBusNomUsuario = (this.txtBusNomUsuario == null) ? null : this.txtBusNomUsuario.trim().toUpperCase();

        String sql = null;
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        sql = "with ca as (";
        sql += " select ca2.nid_control_acceso, ca2.nid_usuario, ca2.nid_modulo";
        sql += " from (";
        sql += " select ca1.nid_control_acceso, ca1.nid_usuario, ca1.nid_modulo, row_number() over(partition by ca1.nid_usuario, ca1.nid_modulo order by ca1.nid_control_acceso asc) orden";
        sql += " from ssa.control_acceso ca1";
        sql += " where 1 = 1";
        if (this.txtBusFecInicio != null) {
            sql += " AND (to_date(to_char(ca1.fec_registro, 'DD/MM/YYYY'), 'DD/MM/YYYY') >= to_date('" + df.format(this.txtBusFecInicio) + "', 'DD/MM/YYYY'))";
        }
        if (this.txtBusFecFin != null) {
            sql += " AND (to_date(to_char(ca1.fec_registro, 'DD/MM/YYYY'), 'DD/MM/YYYY') <= to_date('" + df.format(this.txtBusFecFin) + "', 'DD/MM/YYYY'))";
        }
        sql += " ) ca2";
        sql += " where ca2.orden = 1)";
        sql += " select distinct us.nid_usuario, us.cod_usuario, ";
        sql += " us.txt_apellido_paterno || ' ' || us.txt_apellido_materno || ' ' || us.txt_nombres, ";
        sql += " us.cod_zonal, zo.txt_zonal, pe.nid_modulo, mo.txt_modulo, ";
        sql += " (select to_char(max(ca3.fec_registro), 'DD/MM/YYYY HH24:MI:SS') fec_registro";
        sql += " from ssa.control_acceso ca3";
        sql += " where ca3.nid_modulo = mo.nid_modulo";
        sql += " and ca3.nid_usuario = us.nid_usuario)";
        sql += " from ssa.usuario us";
        sql += " inner join gen.zonal zo on us.cod_zonal = zo.cod_zonal";
        sql += " inner join ssa.usuario_perfil up on us.nid_usuario = up.nid_usuario";
        sql += " inner join ssa.perfil pe on up.nid_perfil = pe.nid_perfil";
        sql += " inner join ssa.modulo mo on pe.nid_modulo = mo.nid_modulo";
        sql += " left join ca on us.nid_usuario = ca.nid_usuario and pe.nid_modulo = ca.nid_modulo";
        sql += " where us.flg_activo = " + Constante.ESTADO_ACTIVO;
        sql += " and up.flg_activo = " + Constante.ESTADO_ACTIVO;
        sql += " and ca.nid_control_acceso is null";

        if (this.txtBusIdModulo != null) {
            sql += " AND (mo.nid_modulo = " + this.txtBusIdModulo + ")";
        }
        if (this.txtBusCodUsuario != null) {
            sql += " AND (us.cod_usuario LIKE '%" + this.txtBusCodUsuario + "%')";
        }
        if (this.txtBusNomUsuario != null) {
            sql += " AND ((us.txt_apellido_paterno || ' ' || us.txt_apellido_materno || ' ' || us.txt_nombres) LIKE '%" + this.txtBusNomUsuario + "%')";
        }
        sql += " order by us.cod_usuario, zo.txt_zonal, mo.txt_modulo";

        List<Object[]> olstSinAcceso = getService().createNativeQuery(sql, new Object[]{});
        this.lstUsuarioSinAcceso = new ArrayList<UsuarioSinAccesoBean>();
        for (Object[] obj : olstSinAcceso) {
            UsuarioSinAccesoBean oSinAcceso = new UsuarioSinAccesoBean();
            oSinAcceso.setNID_USUARIO(Long.parseLong(obj[0].toString()));
            oSinAcceso.setCOD_USUARIO(obj[1].toString());
            oSinAcceso.setNOMBRES(obj[2].toString());
            oSinAcceso.setCOD_ZONAL(obj[3].toString());
            oSinAcceso.setTXT_ZONAL(obj[4].toString());
            oSinAcceso.setNID_MODULO((obj[5] == null) ? null : Long.parseLong(obj[5].toString()));
            oSinAcceso.setTXT_MODULO((obj[6] == null) ? null : obj[6].toString());
            oSinAcceso.setFEC_REGISTRO((obj[7] == null) ? null : obj[7].toString());
            this.lstUsuarioSinAcceso.add(oSinAcceso);
        }
    }

    public void limpiar() {
        this.txtBusCodUsuario = null;
        this.txtBusNomUsuario = null;
        this.txtBusFecInicio = this.txtToday;
        this.txtBusFecFin = this.txtToday;
        this.txtBusIdModulo = null;
        this.lstUsuarioSinAcceso = new ArrayList<UsuarioSinAccesoBean>();
        setBeanList(lstUsuarioSinAcceso);
    }

    public void print(int tipo) {
        try {
            Collection col = new ArrayList();
            for (UsuarioSinAccesoBean oUsuarioSinAcceso : this.lstUsuarioSinAcceso) {
                col.add(oUsuarioSinAcceso);
            }
            String filtro_fecha = "";
            String filtro_modulo = "";
            String filtro_codigo_usuario = "";
            String filtro_nombre = "";
            if (this.txtBusCodUsuario != null && !this.txtBusCodUsuario.equals("")) {
                filtro_codigo_usuario = String.format("Código de Usuario: %s", this.txtBusCodUsuario);
            } else {
                filtro_codigo_usuario = String.format("Código de Usuario: %s", "Ninguno");
            }
            if (this.txtBusNomUsuario != null && !this.txtBusNomUsuario.equals("")) {
                filtro_nombre = String.format("Nombre de Usuario: %s", this.txtBusNomUsuario);
            } else {
                filtro_nombre = String.format("Nombre de Usuario: %s", "Ninguno");
            }
            if (this.txtBusIdModulo != null) {
                Modulo oModulo = (Modulo) getService().findByNamedQuery("Modulo.findByNidModulo", new Object[]{this.txtBusIdModulo}).get(0);
                filtro_modulo = String.format(" Modulo: %s", oModulo.getTxtModulo());
            } else {
                filtro_modulo = String.format(" Modulo: %s", "Ninguno");
            }
            if (this.txtBusFecInicio != null && this.txtBusFecFin != null) {
                filtro_fecha = String.format("Fecha desde %s al %s / ", (new SimpleDateFormat("dd/MM/yyyy")).format(this.txtBusFecInicio), (new SimpleDateFormat("dd/MM/yyyy")).format(this.txtBusFecFin));
            } else {
                filtro_fecha = String.format("Fecha %s ", "Ninguno");
            }
            HashMap parameters = new HashMap();
            parameters.put("V_FILTRO_FECHA", filtro_fecha);
            parameters.put("V_FILTRO_MODULO", filtro_modulo);
            parameters.put("V_FILTRO_CODIGO_USUARIO", filtro_codigo_usuario);
            parameters.put("V_FILTRO_NOMBRES", filtro_nombre);
            
            Impresion imprimir = new Impresion();
            if (tipo == 0) {
                imprimir.imprimirListado("ssa_rpt_usuarios_sin_acceso", col, parameters);
            } else if (tipo == 1) {
                imprimir.exportarExcel("ssa_rpt_usuarios_sin_acceso", col, parameters);
            }
        } catch (Exception ex) {
            log.error(ex);
        } finally {
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    @Override
    public boolean validate() throws Exception {
        boolean success = true;

        return success;
    }

    public List<UsuarioSinAccesoBean> getLstUsuarioSinAcceso() {
        return lstUsuarioSinAcceso;
    }

    public void setLstUsuarioSinAcceso(List<UsuarioSinAccesoBean> lstUsuarioSinAcceso) {
        this.lstUsuarioSinAcceso = lstUsuarioSinAcceso;
    }

    public String getTxtBusCodUsuario() {
        return txtBusCodUsuario;
    }

    public void setTxtBusCodUsuario(String txtBusCodUsuario) {
        this.txtBusCodUsuario = txtBusCodUsuario;
    }

    public java.util.Date getTxtBusFecInicio() {
        return txtBusFecInicio;
    }

    public void setTxtBusFecInicio(java.util.Date txtBusFecInicio) {
        this.txtBusFecInicio = txtBusFecInicio;
    }

    public java.util.Date getTxtBusFecFin() {
        return txtBusFecFin;
    }

    public void setTxtBusFecFin(java.util.Date txtBusFecFin) {
        this.txtBusFecFin = txtBusFecFin;
    }

    public Long getTxtBusIdModulo() {
        return txtBusIdModulo;
    }

    public void setTxtBusIdModulo(Long txtBusIdModulo) {
        this.txtBusIdModulo = txtBusIdModulo;
    }

    public String getTxtBusNomUsuario() {
        return txtBusNomUsuario;
    }

    public void setTxtBusNomUsuario(String txtBusNomUsuario) {
        this.txtBusNomUsuario = txtBusNomUsuario;
    }

    public List<Modulo> getLstModulos() throws ServiceException {
        this.lstModulos = getService().findByNamedQuery("Modulo.findByFlgActivo", new Object[]{Constante.ESTADO_ACTIVO});
        return this.lstModulos;
    }

    public void setLstModulos(List<Modulo> lstModulos) {
        this.lstModulos = lstModulos;
    }

    public List<Perfil> getLstPerfiles() throws ServiceException {
        this.lstPerfiles = getService().findByNamedQuery("Perfil.findByFlgActivo", new Object[]{"1"});
        return this.lstPerfiles;
    }

    public void setLstPerfiles(List<Perfil> lstPerfiles) {
        this.lstPerfiles = lstPerfiles;
    }

    public java.util.Date getTxtToday() {
        return txtToday;
    }

    public void setTxtToday(java.util.Date txtToday) {
        this.txtToday = txtToday;
    }
}
